/*
 * SPDX-FileCopyrightText: 2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test.rule

import android.app.Application
import android.util.Log
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.sanji.audio_test.ContactGroupInfo
import com.sanji.audio_test.withContactGroups
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

/**
 * 选择联系人组ViewModel
 * 负责管理联系人组数据和相关业务逻辑
 * @param application 应用程序实例
 */
class PickContactGroupViewModel(application: Application) : AndroidViewModel(application) {
    // 提醒信息状态流，用于存储和发射提醒事件
    private val _alerts = MutableStateFlow<List<PickContactGroupAlert>>(emptyList())
    val alerts = _alerts.asStateFlow()

    // 联系人组信息状态流，用于存储和发射联系人组数据
    private val _groups = MutableStateFlow<List<ContactGroupInfo>>(emptyList())
    val groups = _groups.asStateFlow()

    // 初始化块，在ViewModel创建时刷新联系人组数据
    init {
        refreshGroups()
    }

    /**
     * 刷新联系人组数据
     * 在后台线程中获取并排序联系人组信息
     */
    private fun refreshGroups() {
        viewModelScope.launch {
            withContext(Dispatchers.IO) {
                try {
                    // 获取联系人组数据并按指定规则排序
                    val groups = withContactGroups(getApplication()) { contactGroups ->
                        contactGroups
                            .sortedWith { o1, o2 ->
                                compareValuesBy(
                                    o1,
                                    o2,
                                    { it.title },           // 首先按标题排序
                                    { it.accountName },     // 然后按账户名排序
                                    { it.rowId },           // 再按行ID排序
                                    { it.sourceId },        // 最后按源ID排序
                                )
                            }
                            .toList()
                    }

                    // 更新联系人组状态流
                    _groups.update { groups }
                } catch (e: Exception) {
                    // 捕获异常并记录日志，同时发送查询失败提醒
                    Log.w(TAG, "Failed to list all contact groups", e)
                    _alerts.update { it + PickContactGroupAlert.QueryFailed(e.toString()) }
                }
            }
        }
    }

    /**
     * 确认第一个提醒
     * 从提醒列表中移除第一个提醒
     */
    fun acknowledgeFirstAlert() {
        _alerts.update { it.drop(1) }
    }

    // 伴生对象
    companion object {
        // 日志标签，使用类名作为标签
        private val TAG = PickContactGroupViewModel::class.java.simpleName
    }
}